<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
@ingroup CP_PLUGINS
@nosubgrouping
@brief Gadget

Gadget

*/
class cpGadget extends cpMessages
{
	
	

	
	
	protected $core;	///< <b>cpCore</b>	Instance de cpCore
	
	public $gadget_inst_id;
	public $theme_id;
	public $zone_id;
	public $gadget_id;
	public $gadget_inst_conditions;
	public $gadget_inst_titre;
	public $gadget_inst_data;
	
	public $i;
	
	
	

	
	/// @name Initialisation
	//@{
	
	
	/**
	Initialise une instance de cpGadget.
	
	@param	core		<b>cpCore</b>		Référence à cpCore
	@param	gadget_id	<b>string</b>		Identifiant du type de gadget (et non de l'instance de gadget)
	@param	rs			<b>recordset</b>	Données de la base de données (facultatif)
	*/
	public function __construct($core, $gadget_id, $rs=null)
	{
		$this->core =& $core;
		$this->gadget_id = $gadget_id;
		
		if(is_object($rs)) {
			$this->initRs($rs);
		} else {
			$this->initDefaut();
		}
		
	}
	
	
	/** @ignore */
	protected function initRs($rs)
	{
		
		$this->gadget_inst_id 			= (integer) $rs->gadget_inst_id;
		$this->theme_id					= $rs->theme_id;
		$this->zone_id					= $rs->zone_id;
		$this->gadget_id				= $rs->gadget_id;
		$this->gadget_inst_conditions	= unserialize($rs->gadget_inst_conditions);
		$this->gadget_inst_titre		= $rs->gadget_inst_titre;
		$this->gadget_inst_data			= $rs->gadget_inst_data;
		
		# --COMPORTEMENT-- coreInitRsGadget
		$this->core->executerComportement('coreInitRsGadget', $rs, $this);
		
	}
	
	
	/**
	Définit les paramètres par défaut pour un nouveau gadget.
	
	Cette méthode est utilisée pour afficher le formulaire de configuration d'un
	gadget qui n'a pas encore été enregistré dans la base de données.
	*/
	public function initDefaut()
	{
		$this->gadget_inst_titre		= $this->core->gadgets[$this->gadget_id]['nom'];
	}
	
	
	/** @ignore */
	public function setI($i)
	{
		$this->i = $i;
	}
	//@}
	
	
	
	

	/// @name Accès aux propriétés du gadget
	//@{
	
	
	/**
	Retourne le nom du type de gadget.
	*/
	public function getNom()
	{
		return $this->core->gadgets[$this->gadget_id]['nom'];
	}
	//@}
	
	
	
	

	/// @name Interface d'administration
	//@{
	
	
	/**
	Retourne l'interface d'administration du gadget.
	
	La valeur de retour est un tableau de deux éléments:
	'html': 		code html de l'interface
	'javascript': 	code javascript exécuté lorsque l'interface est initialisée
	
	@return	<b>array</b>
	*/
	public function adminInterface()
	{
		return array(
			'html' => '',
			'javascript' => ''
		);
	}
	
	
	/**
	Indique si le gadget peut être ajouté à un thème. Si le gadget ne peut
	pas être ajouté, il doit en indiquer la raison via le paramètre message.
	
	@param	message		<b>string</b>		Message indiquant pourquoi le gadget ne peut pas être ajouté
	
	@return	<b>boolean</b>
	*/
	public static function adminPeutEtreAjoute(&$message)
	{
		return true;
	}
	
	
	/**
	Retourne un tableau contenant un nom de champ et un identifiant de champ
	à utiliser dans le formulaire de configuration du gadget.
	
	@param	champ		<b>string</b>		Nom de champ avant modification
	
	@return	<b>array</b>
	*/
	public function champNomID($champ)
	{
		return array(
			$this->champNom($champ),
			$this->champID($champ)
		);
	}
	
	
	/**
	Retourne un nom de champ à utiliser dans le formulaire de configuration
	du gadget.
	
	@param	champ		<b>string</b>		Nom de champ avant modification
	
	@return	<b>string</b>
	*/
	public function champNom($champ)
	{
		return 'gadget['.$this->i.']['.$champ.']';
	}
	
	
	/**
	Retourne un identifiant de champ à utiliser dans le formulaire de
	configuration du gadget.
	
	@param	champ		<b>string</b>		Nom de champ avant modification
	
	@return	<b>string</b>
	*/
	public function champID($champ)
	{
		return 'gdg_'.$this->i.'_'.$champ;
	}
	//@}
	
	
	
	

	/// @name Enregistrer
	//@{
	
	
	/**
	Enregistre le gadget.
	
	@param	formulaire	<b>array</b>		Données de formulaire
	*/
	public function enregistrer($formulaire)
	{
		
		# Vérification du thème
		$this->core->chargerThemes();
		$theme = $this->core->getObjetTheme($formulaire['theme_id']);
		
		# Vérification de la zone
		$zonesGadgets = $theme->getZonesGadgets();
		if(!array_key_exists($formulaire['zone_id'], $zonesGadgets)) {
			throw new cpErreur(__('Donnée invalide'), 'zone_id', 301);
		}
		
		# Affichage
		if(!in_array($formulaire['affichage'], array('1', '2'))) {
			throw new cpErreur(__('Donnée invalide'), 'affichage', 103);
		}

		# Conditions d'affichage		
		$conditionsAffichage = array();
		try {
			if($formulaire['affichage'] == '2') {
				$conditionsAffichage = $this->core->parseConditionsPage($formulaire['conditionsAffichage'], false);
			}
		} catch (cpErreur $e) {
			throw new cpErreur($e->getMessage(), 'gdg_'.$this->i.'_conditionsAffichage', 180);
		}
		
		# Paramètres du gadget
		$data = $this->preparerInstData($formulaire, $iGadget);
			
		# Enregistrer
		$rs = $this->core->con->select(
			'SELECT MAX(gadget_inst_id) '.
			'FROM '.$this->core->prefix.'gadgets'
		);
		
		# Curseur
		$cur = new cursor($this->core->con, $this->core->prefix.'gadgets');
		
		$cur->gadget_inst_id 			= (integer) $rs->f(0) + 1;
		$cur->theme_id					= $formulaire['theme_id'];
		$cur->zone_id					= $formulaire['zone_id'];
		$cur->gadget_id 				= $formulaire['gadget_id'];
		$cur->gadget_inst_conditions	= serialize(array(
											'affichage' => (integer) $formulaire['affichage'],
											'conditions' => $conditionsAffichage
										));
		$cur->gadget_inst_titre			= $formulaire['gadget_titre'];
		$cur->gadget_inst_data			= $data;
		
		# --COMPORTEMENT-- coreAvantEnregistrerGadget
		$this->core->executerComportement('coreAvantEnregistrerGadget', $cur, $this);
		
		$cur->insert();	
		
		# --COMPORTEMENT-- coreApresEnregistrerGadget
		$this->core->executerComportement('coreApresEnregistrerGadget', $cur, $this);

	}
	
	
	/**
	Retourne une chaîne de caractères rassemblant tous les paramètres du
	gadget. Cette chaîne sera enregistrée dans le champ gadget_inst_data de
	la base de données.
	
	@param	data	<b>array</b>		Données de formulaire
	@return 	<b>string</b>
	*/
	public function preparerInstData($data)
	{
		return NULL;
	}
	//@}
	
	
	
	

	/// @name Public
	//@{
	
	
	/**
	Vérifie si le gadget devrait être affiché sur une page.
	
	@param	_ctx		<b>cpContexte</b>
	
	@return	<b>boolean</b>
	*/
	public function verifierAffichage($_ctx)
	{
		
		if($this->gadget_inst_conditions['affichage'] == 1) {
			return true;
		}
		
		$sql = $this->core->conditionsPageToSQL($this->gadget_inst_conditions['conditions']);

		$rs = $this->core->site->getPages(array(
			'page_id'			=> $_ctx->page->page_id,
			'operateur' 		=> CP_OPERATEUR_AND,
			'conditions_supp'	=> array('( '.$sql.' )')
		), CP_GET_COMPTEUR);
		
		if($rs->f(0) == 1) {
			return true;
		}
		
		return false;
		
	}
	
	
	/**
	Retourne le titre du gadget.
	
	@return	<b>string</b>
	*/
	public function public_titre($_ctx)
	{
		return $this->gadget_inst_titre;
	}
	
	
	/**
	Retourne le contenu du gadget.
	
	@return	<b>string</b>
	*/
	public function public_contenu($_ctx)
	{
		return '';
	}
	//@}
	
	
}

?>